package com.marketing.common.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;

/**
 * 日期工具类
 */
public class DateUtils {
    
    /**
     * 默认日期时间格式
     */
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    /**
     * 默认日期格式
     */
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    
    /**
     * 默认时间格式
     */
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    
    /**
     * 将日期格式化为字符串
     * 
     * @param date 日期
     * @param pattern 格式模式
     * @return 格式化后的字符串
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        return DateUtil.format(date, pattern);
    }
    
    /**
     * 将LocalDateTime格式化为字符串
     * 
     * @param dateTime 日期时间
     * @param pattern 格式模式
     * @return 格式化后的字符串
     */
    public static String format(LocalDateTime dateTime, String pattern) {
        if (dateTime == null) {
            return null;
        }
        return LocalDateTimeUtil.format(dateTime, pattern);
    }
    
    /**
     * 将字符串解析为Date
     * 
     * @param dateStr 日期字符串
     * @param pattern 格式模式
     * @return Date对象
     */
    public static Date parseDate(String dateStr, String pattern) {
        if (StringUtils.isBlank(dateStr)) {
            return null;
        }
        return DateUtil.parse(dateStr, pattern);
    }
    
    /**
     * 将字符串解析为LocalDateTime
     * 
     * @param dateTimeStr 日期时间字符串
     * @param pattern 格式模式
     * @return LocalDateTime对象
     */
    public static LocalDateTime parseDateTime(String dateTimeStr, String pattern) {
        if (StringUtils.isBlank(dateTimeStr)) {
            return null;
        }
        return LocalDateTimeUtil.parse(dateTimeStr, pattern);
    }
    
    /**
     * 获取当前日期时间
     * 
     * @return LocalDateTime对象
     */
    public static LocalDateTime currentDateTime() {
        return LocalDateTime.now();
    }
    
    /**
     * 获取今天的开始时间
     * 
     * @return LocalDateTime对象
     */
    public static LocalDateTime todayStart() {
        return LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
    }
    
    /**
     * 获取今天的结束时间
     * 
     * @return LocalDateTime对象
     */
    public static LocalDateTime todayEnd() {
        return LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
    }
    
    /**
     * 获取指定日期的开始时间
     * 
     * @param date 日期
     * @return LocalDateTime对象
     */
    public static LocalDateTime dayStart(LocalDate date) {
        if (date == null) {
            return null;
        }
        return LocalDateTime.of(date, LocalTime.MIN);
    }
    
    /**
     * 获取指定日期的结束时间
     * 
     * @param date 日期
     * @return LocalDateTime对象
     */
    public static LocalDateTime dayEnd(LocalDate date) {
        if (date == null) {
            return null;
        }
        return LocalDateTime.of(date, LocalTime.MAX);
    }
    
    /**
     * 计算两个日期之间的天数差
     * 
     * @param start 开始日期
     * @param end 结束日期
     * @return 天数差
     */
    public static long daysBetween(LocalDate start, LocalDate end) {
        if (start == null || end == null) {
            return 0;
        }
        return java.time.temporal.ChronoUnit.DAYS.between(start, end);
    }
}